/**
 * new 操作符,做了哪些c操作
 * 1.创建了一个空对象
 * 2.将空对象的原型指向构造函数的prototype
 * 3.将构造函数的作用域赋给新对象
 * 4.执行构造函数中的代码
 * 5.如果构造函数有返回值,则将返回值作为新对象
 * 6.如果构造函数没有返回值,则将新对象作为返回值
 * 
 * 
 */

function myNew(fn, ...args) {
    // 1.创建空对象
    let obj = new Object(); // 创建空对象  Object.create(fn.prototype)
    // 2.将空对象的原型指向构造函数的prototype
    obj.__proto__ = fn.prototype;
    // 3.将构造函数的作用域赋给新对象
    let res = fn.apply(obj, args);
    // 4.执行构造函数中的代码
    if(typeof res == 'object') {
        return res;
    } else {
        return obj;
    }

}